package pe.bf.extranet.web;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

import pe.bf.domain.bean.Banco;
import pe.bf.domain.bean.Distrito;
import pe.bf.domain.bean.Empleado;
import pe.bf.domain.bean.Moneda;
import pe.bf.domain.bean.SolicitudCreacion;
import pe.bf.domain.bean.TipoCuenta;
import pe.bf.domain.bean.TipoDocumento;
import pe.bf.domain.bean.Transferencia;
import pe.bf.domain.bean.Usuario;
import pe.bf.extranet.cliente.ClienteWS;


//@WebServlet("/solCreaAboServlet")
public class SolCreaAboServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public SolCreaAboServlet() {
        super();
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
		doPost(request, response);
		

	}
 
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		
		Usuario usuario=(Usuario)request.getSession().getAttribute("usuarioBean");
		if(usuario==null){
            request.getRequestDispatcher("servlet").forward(request, response); 
            return;
		}
		
		
		String p_accion=request.getParameter("accion");
		obtenerMonedas(request);
		obtenerTipoCuentas(request);
		obtenerListaSolicitudes(request,usuario.getEmpresa().getIdEmpresa()); 
		String p_archivo=request.getParameter("txtArchivo");
		String p_tipo=request.getParameter("txtTipoCuenta");
		String p_moneda=request.getParameter("txtMoneda"); 		
		String idSolicitud=request.getParameter("idSolicitud");
		String hidFecha=request.getParameter("hidFecha");
		String hidNombre=request.getParameter("hidNombre");
		String hidTipo=request.getParameter("hidTipo");
		File uploadedFile = null;
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);

	        if (isMultipart) {
	        	
	        	FileItemFactory factory = new DiskFileItemFactory();
	            ServletFileUpload upload = new ServletFileUpload(factory);
	            
	            try {
	                List items = upload.parseRequest(request);
	                Iterator iterator = items.iterator();
	                while (iterator.hasNext()) {
	                    FileItem item = (FileItem) iterator.next();  
	                        if(item.getFieldName().equals("txtTipoCuenta")){
	                        	p_tipo=item.getString();
	                        }else if(item.getFieldName().equals("accion")){
	                        	p_accion=item.getString();
	                        }else if(item.getFieldName().equals("txtMoneda")){
	                        	p_moneda=item.getString();
		                    }else if(item.getFieldName().equals("idSolicitud")){
		                    	idSolicitud=item.getString();
		                    }else if(item.getFieldName().equals("hidFecha")){
		                    	hidFecha=item.getString();
		                    }else if(item.getFieldName().equals("hidNombre")){
		                    	hidNombre=item.getString();
		                    }else if(item.getFieldName().equals("hidTipo")){
		                    	hidTipo=item.getString();
		                    }else if(item.getFieldName().equals("txtArchivo")  && p_accion.equals("grabar_creacion_cuenta")){
	                      	  String root = getServletContext().getRealPath("/");
	                            File path = new File(root + "/solCreaAboServlet");
	                            if (!path.exists()) {
	                                boolean status = path.mkdirs();
	                            }

	                            uploadedFile = new File(path + "/" + item.getName()); 
	                            item.write(uploadedFile);
	                        }          
	                    
	                }
	            } catch (FileUploadException e) {
	                e.printStackTrace();
	                request.setAttribute("error", "Error al abrir el archivo. Confirmar si el formato es correcto.");
	                request.getRequestDispatcher("solcreaabo.jsp").forward(request, response);
	                return;
	            } catch (Exception e) {
	                e.printStackTrace();
	                request.setAttribute("error", "Error al abrir el archivo. Confirmar si el formato es correcto.");
	                request.getRequestDispatcher("solcreaabo.jsp").forward(request, response);
	                return;
	            }
	            
	        	
	        }
		  
          
           
	        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("ddMMyyyy");
          
		if(p_accion!=null){
			 if(p_accion.equals("grabar_creacion_cuenta")){
				 SolicitudCreacion solicitudcreacion=new SolicitudCreacion();  
				 solicitudcreacion.setNombreArchivo(uploadedFile.getName());
				 StringTokenizer descompuesto=new StringTokenizer(uploadedFile.getName(),"-");
				 Date fechaSolicitud=null;
				 try {
					 String ruc=descompuesto.nextToken();
					 String nroRegistros=descompuesto.nextToken();
					 String fechaSolicitudStr=descompuesto.nextToken();
					 fechaSolicitudStr=fechaSolicitudStr.substring(0,8);
					 System.out.println("parse " + fechaSolicitudStr );
					 fechaSolicitud = formatoDelTexto.parse(fechaSolicitudStr); 
					 solicitudcreacion.setFechaCreacionArchivo(fechaSolicitudStr);
					 
				} catch (Exception e) {
					obtenerListaSolicitudes(request,usuario.getEmpresa().getIdEmpresa()); 
					request.setAttribute("error", "Nombre de archivo no tiene el formato correcto RUC-NROREGISTROS-FECHA(DDMMYYYY).xls");
					e.printStackTrace();
					request.getRequestDispatcher("solcreaabo.jsp").forward(request, response); 
					return;
				}
				 
				 solicitudcreacion.setTipoCuenta(new TipoCuenta(Long.valueOf(p_tipo),""));
				 solicitudcreacion.setMoneda(new Moneda(Long.valueOf(p_moneda),""));
				 solicitudcreacion.setEmpresa(usuario.getEmpresa());
				 solicitudcreacion.setFechaCreacion(fechaSolicitud);
				 solicitudcreacion.setUsuarioCreacion(usuario.getIdUsuario()+"");
				 solicitudcreacion.setAdjunto(read(uploadedFile));
				 solicitudcreacion.setNroRegistros(new BigDecimal("0")); 
				 List<Empleado> listaEmpleado=new ArrayList();
					try
					{
					FileInputStream fileInputStream = new FileInputStream(uploadedFile); 
					POIFSFileSystem fsFileSystem = new POIFSFileSystem(fileInputStream); 
					HSSFWorkbook workBook = new HSSFWorkbook(fsFileSystem);
					HSSFSheet hssfSheet = workBook.getSheetAt(0); 
					Iterator rowIterator = hssfSheet.rowIterator();
					
					if(rowIterator.hasNext()){
						rowIterator.next();
					}
					 
					
						while (rowIterator.hasNext())
						{
							
								Empleado empleado=new Empleado();
								HSSFRow hssfRow = (HSSFRow) rowIterator.next();
								Iterator iterator = hssfRow.cellIterator();  
								empleado.setTipocuenta(new TipoCuenta(Long.valueOf(p_tipo),""));
								empleado.setMoneda(new Moneda(Long.valueOf(p_moneda),""));
								empleado.setEmpresa(usuario.getEmpresa());
								empleado.setUsuariocreacion(usuario.getIdUsuario()+""); 
								empleado.setTipodocumento(new TipoDocumento(getLong(iterator.next()))); 
								empleado.setNrodocumento(getLong(iterator.next())+"");
								empleado.setApellidonombre(((HSSFCell) iterator.next()).getStringCellValue());
								empleado.setSexo(new BigDecimal(((HSSFCell) iterator.next()).getNumericCellValue())); 
								
								Date fecha = formatoDelTexto.parse(getLong(iterator.next())+""); 
								empleado.setFechanacimiento(fecha);
								empleado.setEstadocivil(new BigDecimal(((HSSFCell) iterator.next()).getNumericCellValue()));
								 iterator.next();//falta nacionalidad
								empleado.setOcupacion(getLong(iterator.next())+"");
								empleado.setTelefono(getLong(iterator.next())+"");
								empleado.setDireccion(((HSSFCell) iterator.next()).getStringCellValue());
								empleado.setDistrito(((HSSFCell) iterator.next()).getStringCellValue()); 
								empleado.setUbigeo(getLong(iterator.next())+"");
								empleado.setMoneda(new Moneda(getLong(iterator.next())));
								System.out.println("empleado " +empleado.getEmpresa().getIdEmpresa());
								listaEmpleado.add(empleado);
						}
					}
					catch (Exception e)
					{
						obtenerListaSolicitudes(request,usuario.getEmpresa().getIdEmpresa()); 
						request.setAttribute("error", "Error al leer celdas del archivo. Confirme si el formato es correcto");
						e.printStackTrace();
						request.getRequestDispatcher("solcreaabo.jsp").forward(request, response); 
						return;
					}

					 solicitudcreacion.setNroRegistros(new BigDecimal(listaEmpleado.size()));
					solicitudcreacion.setListaEmpleados(listaEmpleado);
				  List<String> resultado=grabarSolicitud(solicitudcreacion);
				 if((resultado!=null && resultado.size()==0) || resultado==null){
					 request.setAttribute("mensaje", "Solicitud creada exitosamente.");
					 obtenerListaSolicitudes(request,usuario.getEmpresa().getIdEmpresa());

				 }else{
					 obtenerListaSolicitudes(request,usuario.getEmpresa().getIdEmpresa()); 
					 request.setAttribute("error", "Error al intentar grabar la solicitud.");
					 request.setAttribute("listaErrores", resultado);
				 }
				 
			 }else if (p_accion.equals("carga_detalle_creacion")){
				 obtenerListaSolicitudes(request,usuario.getEmpresa().getIdEmpresa());
				 request.setAttribute("hidTipo",hidTipo);
				 request.setAttribute("hidFecha",hidFecha);
				 request.setAttribute("hidNombre",hidNombre);
				 obtenerDetalles(request,usuario.getEmpresa().getIdEmpresa(),idSolicitud);
			 }
			 
			 request.getRequestDispatcher("solcreaabo.jsp").forward(request, response); 
			 return;
		}else{
			obtenerListaSolicitudes(request,usuario.getEmpresa().getIdEmpresa()); 
			request.getRequestDispatcher("solcreaabo.jsp").forward(request, response); 
			return;
		}
		
		
	}
	
	
	private Long getLong(Object objecto){
		return Long.valueOf((long)((HSSFCell) objecto ).getNumericCellValue());
	}

	public byte[] read(File file) throws IOException {
 


	    byte []buffer = new byte[(int) file.length()];
	    InputStream ios = null;
	    try {
	        ios = new FileInputStream(file);
	        if ( ios.read(buffer) == -1 ) {
	            throw new IOException("EOF reached while trying to read the whole file");
	        }        
	    } finally { 
	        try {
	             if ( ios != null ) 
	                  ios.close();
	        } catch ( IOException e) {
	        }
	    }

	    return buffer;
	}
	
	private void obtenerMonedas(HttpServletRequest request) { 
		List<Moneda> lista= ClienteWS.findMonedas(); 
		request.setAttribute("lista_moneda", lista); 
	}
	
	
	
	private void obtenerTipoCuentas(HttpServletRequest request) { 
		List<TipoCuenta> lista=ClienteWS.findTipoCuentas();
		request.setAttribute("lista_tipoCuenta", lista); 
	}
	
	
	
	private void obtenerListaSolicitudes(HttpServletRequest request,Long codigoEmpresa) { 
		List<SolicitudCreacion> lista= ClienteWS.listarSolicitudCreacionPorEmpresa(codigoEmpresa) ;
		request.setAttribute("listaSolicitudesAbo", lista); 
	}
 
	private void obtenerDetalles(HttpServletRequest request,Long codigoEmpresa,String idSolicitud) {  
		List<Empleado> lista= ClienteWS.listarDetalleSolicitudCreacion(codigoEmpresa, Long.valueOf(idSolicitud));
		request.setAttribute("listaEmpleado", lista); 
	}
 

	private List<String> grabarSolicitud(SolicitudCreacion solicitudcreacion) { 
		return ClienteWS.createSolicitudCreacion(solicitudcreacion);
	}
	
	
	 

}
